#ifndef __CLI_NETWORK_H
#define __CLI_NETWORK_H

#include <sys/socket.h> // 套接字 API
#include <netinet/in.h> // Internet 地址族
#include <arpa/inet.h>  // 定义 inet_addr

/**
 * @brief 隧道信息结构体
 *
 */
typedef struct
{
    struct sockaddr_in addr; /**< socket地址 */
    socklen_t addr_len;      /**< socket地址长度 */
    char ip[16];             /**< ip地址 */
    int port;                /**< 端口 */
    int socket_fd;           /**< 套接字文件描述符 */
    int max_connections;     /**< 最大连接数 */
    int if_reuse;            /**< 是否可重用端口 */
} Tunnel_t;

/**
 * @brief 初始化客户端 TCP 连接
 *
 * @param server_ip 服务器 IP
 * @param server_port 服务器端口
 * @return int 返回套接字文件描述符
 */
int initClientTcp(const char *server_ip, int server_port);

/**
 * @brief 关闭客户端 TCP 连接
 *
 * @param socket_fd 套接字文件描述符
 */
void closeClientTcp(int socket_fd);

/**
 * @brief 循环发送数据
 * 内部循环使用send保证数据完全发送
 * @param sockfd 套接字文件描述符
 * @param buffer 缓冲区
 * @param length 长度
 * @param flags 标志
 * @return ssize_t 返回发送的字节数
 */
ssize_t sendAll(int sockfd, const void *buffer, size_t length, int flags);

/**
 * @brief 循环接收数据
 * 内部循环使用recv保证数据完全接收
 * @param sockfd 套接字文件描述符
 * @param buffer 缓冲区
 * @param length 长度
 * @param flags 标志
 * @return ssize_t 返回接收的字节数
 */
ssize_t recvAll(int sockfd, void *buffer, size_t length, int flags);

/**
 * @brief 连接隧道
 *
 * @param socket_fd 套接字文件描述符
 * @param tunnel 隧道信息
 * @return int 返回隧道套接字文件描述符
 */
int connectTunnel(int socket_fd, Tunnel_t *tunnel);

#endif /* __CLI_NETWORK_H */